package com.ply.mapper;

import com.ply.entity.pojo.Project;
import com.ply.entity.pojo.VoteOption;
import com.ply.entity.vo.OptionAndSum;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author fxj
 */
@Mapper
public interface ProjectMapper {

    /**
     * 根据用户id和ProjectAndOption对象创建投票
     * 创建投票中增加项目表
     *
     * @param userId
     * @param name
     * @param voteNumEvery
     * @param startAt
     * @param isRadio
     * @return
     */
    int AddCreateVoteProject(@Param("userId") int userId, @Param("name") String name, @Param("voteNunEvery") int voteNumEvery,
                             @Param("startAt") Date startAt, @Param("endAt") Date endAt, @Param("isRadio") int isRadio);

    /**
     * 根据用户id和ProjectAndOption对象创建投票
     * 创建投票中增加选项表
     *
     * @param creatVoteId
     * @param name
     * @param details
     * @return
     */
    int AddCreateVoteOption(@Param("creatVoteId") int creatVoteId, @Param("name") String name, @Param("details") String details);

    /**
     * 修改投票项目的状态
     *  状态 1:审核中, 2:未开始, 3: 投票中, 4:投票结束, 5:异常
     * @param projectId
     * @param status
     * @return
     */
    int updateProjectStatus(@Param("projectId") int projectId, @Param("status") int status);

    /**
     * 给审核通过的项目增加审核人的id
     *
     * @param projectId
     * @param auditId
     * @return
     */
    int addProjectAuditId(@Param("projectId") int projectId, @Param("auditId") int auditId);


    /**
     * 增加投票数
     *
     * @return
     */

    int addVoteNum(@Param("optionId") int optionId);

    /**
     * 查询最后一条记录的项目id
     *
     * @return
     */
    Integer selectMaxProjectId();

    /**
     * 根据选项id查询项目id
     *
     * @param optionId
     * @return
     */
    Integer selectProjectIdByOptionId(@Param("optionId") int optionId);

    /**
     * 根据ip和项目id查询记录表里该项目今天投了多少票
     *
     * @param projectId
     * @param ip
     * @return
     */
    Integer selectVoteNumByIp(@Param("projectId") int projectId, @Param("ip") String ip);

    /**
     * 根据项目id查询每日每ip可投票数
     *
     * @param projectId
     * @return
     */
    Integer selectVoteNumEveryByProjectId(@Param("projectId") int projectId);

    /**
     * 增加投票记录
     *
     * @param optionId
     * @param ip
     * @return
     */
    int addVoteRecord(@Param("optionId") int optionId, @Param("ip") String ip);

    /**
     * 购买时间后修改结束日期为延迟之后的结束日期
     *
     * @return
     */
    int updateEndAt(@Param("userId") int userId,@Param("projectId") int projectId, @Param("endAt") Date endAt);

    /**
     * 根据项目id查询结束时间
     *
     * @param projectId
     * @return
     */
    Date selectEndAtByProject(@Param("projectId") int projectId);

    /**
     * 根据项目id查询项目是否存在
     *
     * @param projectId
     * @return
     */
    Project selectProject(@Param("projectId") int projectId);

    /**
     * 根据项目id查询项目信息(不包括选项信息)
     *
     * @param projectId
     * @return
     */
    Project selectProjectByProjectId(@Param("projectId") int projectId);

    /**
     * 根据项目id查询选项信息
     *
     * @param projectId
     * @return
     */
    List<VoteOption> selectOptionByProjectId(@Param("projectId") int projectId);

    /**
     * 根据项目id查询项目的状态
     * @param projectId
     * @return
     */
    Integer selectStatusByProjectId(@Param("projectId") int projectId);

    /**
     * 查询该选项是否存在
     * @param optionId
     * @return
     */
    VoteOption selectOptionis(@Param("optionId") int optionId);

    /**
     * 根据项目id查询选项的名字和投票数，返回一个list集合
     * @param projectId
     * @return
     */
    List<OptionAndSum> selectOptionNameAndSum(@Param("projectId") int projectId);

    /**
     * 根据项目id查询用户id
     * @param projectId
     * @return
     */
    Integer selectUserIdByProjectId(@Param("projectId") int projectId);

    List<Project> queryProjectAllByStatus(@Param("projectStatuas") int projectStatuas);
}
